package com.zhj.tree.list;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * ArrayList\LinkedList
 * 1. LinkedList在新增删除时会高于ArrayList？
 */
public class List {


    public static void main(String[] args) {
        /**
         * 1. ArrayList新增元素有两种方式，尾部插入以及指定位置插入，
         * 如果使用指定方式插入，插入位置之后的每个数据都会进行重新排列，数据越靠前性能越低；
         * （比较清楚存储数据大小）如果直接在尾部插入，那么性能会比其他的List集合还要好
         *
         * 2. 删除元素时，每一次删除都会导致后面的数据进行重新排序
         */
        ArrayList<Object> array = new ArrayList<>(2);
        array.add(1, 1);
        array.add(1);

        /**
         * 1. LinkedList遍历和删除元素操作比较类似，通过分前后两端来循环查找对应的元素，如果要删除的
         * 的元素处于List的前半段，就从前往后找，若处于位置的后半段就从后往前找。但是如果List的数据量过大
         * 移除/遍历的元素又在中间段，就会效率很低
         *
         */
        LinkedList<Object> linked = new LinkedList<>();
        linked.add(1, 1);
        linked.add(1);
        /**
         * LinkedList、ArrayList性能对比（在不需要扩容的前提）
         * 1. 头部插入数据
         *      ArrayList < LinkedList : 因为在数组插入头部时，后面的数据都需要进行重新排序，所以性能很底下；而LinkedList，在遍历时进行分段，前半段从前往后，直接遍历到了头部数据性能很高
         * 2. 中部插入数据
         *      ArrayList > LinkedList : LinkedList插入的数据在中部，不管是前半段还是后半段，新能都是最低的；而ArrayList 由在中部只有部分数据需要进行排序
         * 3. 尾部插入数据
         *      ArrayList > LinkedList : LinkedList因为涉及到了new对象指针的变换需要耗费时间，而 ArrayList 不需要扩容的情况下，直接对尾部的空间进行赋值，效率很高
         */
    }

}
